Playdate Lua OOP 面向对象

PlaydateLua 开发环境为游戏机程序设计提供了一个独特的角度,尤其是在面向对象编程(OOP)方面。尽管 Lua 本身不内置支持 OOP,但 Playdate 的 CoreLibs 库提供了一套基本的类系统来模拟 OOP 功能。

Note

Lua 语言本身并不直接支持面向对象编程。这意味着在 Playdate 开发中,使用 OOP 是基于开发者的个人偏好而非必须。对于习惯于 OOP 的开发者,通过 Playdate 的 CoreLibs 库可以实现类似的环境。

CoreLibs 的类系统

要在 Playdate 的 Lua 环境中使用 OOP,首先需要引入 CoreLibs/object 库。这是基础类库中的核心组件,提供了面向对象的基本功能。

创建类

使用 class 函数可以创建一个新的类。这个函数接受三个参数:类名、属性列表和命名空间。如果不指定父类,新类将默认继承自 Object 基类。

创建基础类的例子

class('Tree').extends()

或者带属性的基类:

class('Tree', {color = 'Brown'}).extends(Object)

创建子类的例子

class('Oak').extends(Tree)

创建类示例

-- BeadsChain.lua
import "CoreLibs/graphics"
import "Bead"

local gfx = playdate.graphics

class('BeadsChain').extends()

function BeadsChain:init(x, y, beadRadius, beadCount, gap)
    self.beads = {}
    self.x = x
    self.y = y
    self.beadRadius = beadRadius
    self.beadCount = beadCount
    self.gap = gap
end

function BeadsChain:generateBeads()
    local startX = self.x - ((self.beadCount - 1) * (self.beadRadius * 2 + self.gap)) / 2
    for i = 0, self.beadCount - 1 do
        local beadX = startX + i * (self.beadRadius * 2 + self.gap)
        table.insert(self.beads, Bead(beadX, self.y, self.beadRadius))
    end
end

function BeadsChain:draw()
    if #self.beads > 0 then
        for _, bead in ipairs(self.beads) do
            bead:draw()
        end
        gfx.drawLine(self.beads[1].x, self.y, self.beads[#self.beads].x, self.y)
    end
end

初始化函数(init)

每个类可以定义一个 init 函数,这个函数负责处理对象的初始化。init 函数可以调用父类的 init 函数以继承和扩展父类的初始化行为。

Oak 类的初始化示例

function Oak:init(age, height)
  Oak.super.init(self, age)  -- 调用父类的 init
  self.height = height       -- 添加新属性
end

创建实例

通过调用类名并传递所需参数来创建类的实例。

创建 Oak 类的实例

oakInstance = Oak(age, height)

访问类名和类型检查

可通过 className 属性获取实例的类名:

print(oakInstance.className)  -- 输出 'Oak'

使用 isa() 函数检查实例是否为特定类的实例或子类实例:

oakInstance:isa(Tree)  -- 返回 true,因为 Oak 是 Tree 的子类

调试

Object:tableDump() 函数可以打印对象及其超类的所有键值对,用于调试和检查对象的状态。

使用 tableDump 的例子

oakInstance:tableDump()

本文作者:Maeiee

本文链接:Playdate Lua OOP 面向对象

版权声明:如无特别声明,本文即为原创文章,版权归 Maeiee 所有,未经允许不得转载!


喜欢我文章的朋友请随缘打赏,鼓励我创作更多更好的作品!